import os
import glob

# 设定输入目录路径和输出文件路径
src_path = "data/input"             # 存放HTML文件的目录路径
output = "data/raw_html/raw.txt"    # 保存解析结果的文件路径

class DocInfo:
    """存储文档信息的类"""
    def __init__(self, title="", content="", url=""):
        self.title = title      # 文档的标题
        self.content = content  # 文档的内容
        self.url = url          # 文档的URL

def enum_files(src_path):
    """
    递归列出目录下所有的HTML文件路径
    - 参数: 
        - src_path: HTML文件所在的根目录
    - 返回值: 
        - files_list: 包含所有HTML文件路径的列表
    """
    if not os.path.exists(src_path):
        print(f"{src_path} does not exist.")
        return []

    files_list = []
    # 使用glob模块递归获取所有.html文件路径
    for filepath in glob.iglob(f"{src_path}/**/*.html", recursive=True):
        files_list.append(filepath)
    return files_list

def parse_title(file_content):
    """
    提取HTML文件中的<title>标签内容
    - 参数: 
        - file_content: HTML文件的文本内容
    - 返回值: 
        - 标题字符串，若未找到标题则返回空字符串
    """
    start_tag = "<title>"
    end_tag = "</title>"
    start_index = file_content.find(start_tag)
    if start_index == -1:
        return ""  # 如果没有<title>标签，返回空字符串
    start_index += len(start_tag)
    end_index = file_content.find(end_tag, start_index)
    if end_index == -1:
        return ""  # 如果没有匹配的</title>，返回空字符串
    return file_content[start_index:end_index]

def parse_content(file_content):
    """
    去除HTML标签并提取纯文本内容
    - 参数: 
        - file_content: HTML文件的文本内容
    - 返回值: 
        - 去除标签后的纯文本内容
    """
    import re
    # 使用正则表达式去除HTML标签
    content = re.sub(r'<[^>]+>', ' ', file_content)
    content = content.replace('\n', ' ')  # 将网页源代码中的'\n'替换为空格
    return content.strip()

def parse_url(file_path, src_path):
    """
    根据文件路径生成对应的URL
    - 参数: 
        - file_path: 文件的绝对路径
        - src_path: 输入目录的根路径
    - 返回值: 
        - 生成的文档URL
    """
    url_head = "https://www.boost.org/doc/libs/1_86_0/doc/html"
    url_tail = file_path[len(src_path):]  # 去除输入目录前缀
    return url_head + url_tail

def parse_html(files_list):
    """
    解析HTML文件列表，提取标题、内容和URL
    - 参数: 
        - files_list: 包含HTML文件路径的列表
    - 返回值: 
        - results: 包含DocInfo对象的列表
    """
    results = []
    for file_path in files_list:
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                file_content = f.read()

            # 提取标题、内容和URL
            title = parse_title(file_content)
            if not title:
                continue  # 如果没有标题，跳过当前文件
            content = parse_content(file_content)
            url = parse_url(file_path, src_path)

            # 创建DocInfo对象并添加到结果列表
            doc = DocInfo(title, content, url)
            results.append(doc)

        except Exception as e:
            print(f"Error processing {file_path}: {e}")
            continue
    return results

def save_html(results, output):
    """
    将解析结果保存到指定文件
    - 参数: 
        - results: 包含DocInfo对象的列表
        - output: 输出文件路径
    - 返回值: 
        - 成功返回True，失败返回False
    """
    sep = '\3'  # 使用非显示字符作为分隔符
    try:
        with open(output, 'wb') as out:
            for doc in results:
                # 格式化输出为标题、内容和URL
                out_string = f"{doc.title}{sep}{doc.content}{sep}{doc.url}\n"
                out.write(out_string.encode('utf-8'))
        return True
    except Exception as e:
        print(f"Error saving file {output}: {e}")
        return False

def main():
    """
    主函数
    1. 递归遍历指定目录下的HTML文件
    2. 提取标题、内容和URL
    3. 将结果保存到指定文件
    """
    # 获取HTML文件列表
    files_list = enum_files(src_path)
    if not files_list:
        print("No files found!")
        return

    # 解析HTML文件
    results = parse_html(files_list)
    if not results:
        print("No HTML content parsed!")
        return

    # 保存解析结果
    if not save_html(results, output):
        print("Save failed!")
        return

    print("Process completed successfully.")

if __name__ == "__main__":
    main()
